對應 30天挑戰精通 PowerShell 該書第 18 章。
之前講到了使用 Invoke-Command
進行一對多及透過 Enter-PSSession
進行一對一的遠端操作,今天將介紹第三種使用遠端操作的方式:
「隱含遠端操作」( implicit remoting ),它能讓你能夠從「遠端電腦」匯入「模組」到你的工作階段中,來加入代理命令( proxy command )。
Reference - P.285
首先,當使用 Invoke-Command
或是 Enter-PSSession
時,你不需要每次操作時都指定其電腦名稱、認證資訊以及不同的 Port 號,而是建立一個可重複使用的工作階段(Session),可以大幅提升效率。這樣你就不需要每次都重新建立連線,節省時間和系統資源。
可以透過 Get-Help 看到這兩個 cmdlet 都支援 Session 這個參數,其意義是讓它使用你建立好的 Session 去進行操作。
get-help Invoke-Command -Parameter Session
get-help Enter-PSSession -Parameter Session
工作階段( Session )是指你的 PowerShell 和遠端 PowerShell 之間的長期連線。當工作階段處於啓動狀態時,你的電腦和遠端電腦都會分配一小部分記憶體和處理器時間來維持這個連線。不過,在連線中所需要的網路流量很少。PowerShell 會保留你開啟的工作階段清單,你可以使用這些工作階段來呼叫命令,或是進入一個遠端的 shell。
Reference - P.286
使用 New-PSSession
,透過 -ComputerName
時,若在同網域可使用電腦名稱,若非同網域,則可以使用 IP 進行連線,這裏它預設使用的協定是 WinRM,但你可以透過使用 -HostName
改用 SSH 協定,兩者結果都會產生 Session Object 並存放在 PowerShell 的記憶體裡。
而我們嘗試要透過 New-PSSession
連線之前,讓我梳理一下如何在連線時,依據不同情境提供不同的認證方式:
可以透過建立 加密的 XML 檔案 來安全地儲存遠端伺服器的帳號和密碼。在連線時,使用 Import-CliXml
將 XML 檔案中的內容匯入,生成一個 PSCredential 物件,然後在 New-PSSession
命令中透過 -Credential
參數傳入該物件。
假設遠端伺服器的帳號是 ubuntu
,遠端伺服器的密碼是 1234
,我們要將 XML 檔案儲存在 /Users/kanglin/code/30days/credentialA.xml
提醒:Export-CliXml 會使用 Windows DPAPI 來加密敏感資訊(如密碼)。只有在 相同的使用者帳戶和電腦 上才能解密。
# 提示輸入密碼,建立 PSCredential 物件
$credential = Get-Credential -UserName "ubuntu" -Message "請輸入遠端伺服器的密碼:"
# 將憑證物件加密匯出到 XML 檔案
$credential | Export-CliXml -Path "/Users/kanglin/code/30days/credentialA.xml"
# 從 XML 檔案匯入加密的 PSCredential 物件
$credential = Import-CliXml -Path "C:\Path\To\credential.xml"
# 使用匯入的憑證建立新的遠端會話
$session = New-PSSession -ComputerName "192.168.1.201" -Credential $credential
我使用的 server 為 Ubuntu 20.04。
# 更新軟體包列表
sudo apt update
# 安裝必要的軟體
sudo apt install -y wget apt-transport-https software-properties-common
# 下載 Microsoft 的 GPG 金鑰
wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
# 註冊 Microsoft 的 GPG 金鑰
sudo dpkg -i packages-microsoft-prod.deb
# 再次更新軟體包列表
sudo apt update
# 安裝 PowerShell
sudo apt install -y powershell
為了能讓我從本地端透過 ssh 連線到 remote server 的 pwsh,需要設定 sshd config。
sudo vim /etc/ssh/sshd_config
進入到 sshd_config 後,在最後ㄧ行添加以下指令後,存檔。
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile
sudo systemctl restart sshd
ssh-keygen -t rsa -b 4096
當做完這一步,之後建立 PSSession 連線時,就不需要再輸入驗證了。
ssh-copy-id ubuntu@192.168.1.202
$session = New-PSSession -HostName "ubuntu@192.168.1.202"
$session = Get-PSSession | Where-Object { $_.Id -eq 17 }
Enter-PSSession -session $session
# 僅建立 Session
New-PSSession -HostName "ubuntu@192.168.1.202"
# 取得 Session
$session = Get-PSSession | Where-Object { $_.Id -eq 17 }
# 使用 Session
Invoke-Command -Session $session -ScriptBlock { get-process }
隱含遠端操作 是 PowerShell 中的一種技術,它允許你在本地端使用來自遠端電腦的模組或指令,而無需直接在遠端機器上逐一執行命令。通過隱含遠端操作,你可以將遠端電腦上的 PowerShell 模組匯入到本地端,並且在本地就像使用本機模組一樣使用這些指令,實際上這些指令仍然是在遠端執行。
這個技術特別適合於管理遠端系統資源,如 Active Directory 或其他遠端服務,而不需要你每次都進行遠端登錄。
先透過 New-PSSession
建立與遠端電腦的連線。
$session = New-PSSession -ComputerName 192.168.1.201 -Credential (Get-Credential)
使用 Import-PSSession
匯入 remote server 上的模組。這步驟會將遠端模組的命令匯入到自己本地 PowerShell 會話中。
Import-PSSession -Session $session -Module ActiveDirectory
執行這個指令後,ActiveDirectory 模組的命令就可以在本地端可用,但實際上這些命令是在遠端執行。
透過下列的 cmdlet 就能將原本已經 Disconnected 的 Session 重新 Open 起來。
Get-PSSession -computerName COMPUTER2 | Connect-PSSession
書中也在這裡列出了一些關鍵設定已控制那些斷線的 Session,請參考下面表格:
設定檔位置 | 設定名稱 | 說明 | 預設值/範例 |
---|---|---|---|
WSMan\localhost\shell | IdleTimeout |
PowerShell 會話在無活動後自動終止的時間(毫秒) | 7200000(2 小時) |
WSMan\localhost\shell | MaxConcurrentUsers |
允許同時使用 PowerShell 會話的最大使用者數量 | 5 |
WSMan\localhost\shell | MaxShellRunTime |
每個 PowerShell 會話的最大執行時間 | 無限(如未特別設定) |
WSMan\localhost\shell | MaxShellsPerUser |
每個使用者允許的同時 PowerShell 會話數量 | 25 |
WSMan\localhost\Service | MaxConnections |
允許的最大同時連接數量,針對整個 WSMan 服務(包括所有連接) | 25 |
WSMan\localhost\Service | MaxConcurrentUsers |
整個 WSMan 服務允許的同時連接使用者數量 | 10 |
WSMan\localhost\Service | MaxConcurrentOperationsPerUser |
每個使用者可以同時運行的最大操作數量 | 25 |
WSMan\localhost\Service | EnumerationTimeoutms |
WSMan 操作超時時間設定(毫秒) | 60000 |
Day 22 - 指令碼編寫 Part 1